class Node:
    """
    定义一个节点类

    该类包含以下方法：
    - __init__: 初始化节点
    - __str__: 返回节点数据的字符串表示
    """
    def __init__(self, _data=None, _next=None):
        """
        初始化节点

        参数：
        - _data: 节点的数据
        - _next: 指向下一个节点的指针
        """
        # 初始化节点的数据
        self.data = _data
        # 初始化指向下一个节点的指针
        self.next = _next

    def __str__(self):
        """
        返回节点数据的字符串表示

        返回值：
        - 节点数据的字符串表示
        """
        # 返回节点数据的字符串表示
        return str(self.data)



class LinkedList:
    def __init__(self):
        """
        初始化链表
        创建一个头节点，并将其下一个节点初始化为 None
        """
        self.head = Node()

    def __str__(self):
        """
        返回链表的字符串表示形式
        遍历链表，将每个节点的数据添加到列表中，然后用 '->' 连接起来
        """
        ret = []
        temp = self.head.next  # 从第一个实际节点开始
        while temp:
            ret.append(str(temp))
            temp = temp.next
        return '->'.join(ret)

    def push(self, _data):
        """
        在链表末尾添加一个新节点
        如果链表为空，则将新节点添加到 head 节点之后
        否则，遍历链表找到最后一个节点，并将新节点添加到其后面
        """
        node = Node(_data)
        if self.head.next is None:
            self.head.next = node
        else:
            curr = self.head.next
            while curr.next:
                curr = curr.next
            curr.next = node

    def pop(self):
        """
        移除并返回链表的最后一个节点
        如果链表为空，则抛出 IndexError 异常
        否则，遍历链表找到最后一个节点，并将其从链表中移除
        """
        if self.isEmpty():
            raise IndexError('pop from empty LinkedList')
        prev = self.head
        curr = prev.next
        while curr.next:
            prev = curr
            curr = curr.next
        prev.next = None
        return curr.data

    def __iter__(self):
        """
        迭代器方法，允许使用 for 循环遍历链表
        从第一个实际节点开始，依次返回每个节点的数据
        """
        curr = self.head.next  # 从第一个实际节点开始
        while curr:
            yield curr.data  # 生成当前节点的数据
            curr = curr.next  # 移动到下一个节点

    def isEmpty(self):
        """
        判断链表是否为空
        如果 head 节点的下一个节点为 None，则链表为空
        """
        return self.head.next is None


def remove_sample(link):
    # 使用一个集合来存储已经出现过的元素
    seen = set()

    # 遍历链表
    for i in link:
        # 如果已经在集合里了，不添加
        if i not in seen:
            seen.add(i)
    ret = LinkedList()
    for i in seen:
        ret.push(i)
    link.head = ret.head



lst = LinkedList()
lst.push(1)
lst.push(1)
lst.push(3)
lst.push(3)
lst.push(5)
lst.push(5)
lst.push(7)
remove_sample(lst)

print(lst)

